"""
类中方法：
    种类：普通方法、类方法、静态方法、魔术方法

    类方法：（@classmethod）
        特点：
            1. 定义需要依赖装饰器@classmethod
            2. 类方法中参数不是一个对象，而是类
            3. 类方法只可以使用类属性，无法访问对象属性
            4. 类方法不依赖对象
            5.不能使用普通方法
        作用：
            因为只能访问类属性和类方法，所以可以在对象创建之前，如果需要完成一些动作（功能），就可以方法类方法
    静态方法：（@staticmethod）
        类似于类方法
        1. 需要装饰器staticmethod
        2. 类中的静态方法无需传递参数（cls、self）
        3. 也只能访问类的属性和方法，对象的无法访问
        4. 加载时机同类方法
    总结：
        类方法 静态放啊
            1、装饰器不同
            2、类方法有参数、静态方法无参数
            3、都可以通过类名i盗用
            4、都可以再创建对象之前使用，因为是不依赖于对象。
        普通方法  与类方法和静态的区别
            1、没有装饰器
            2、永远依赖对象
            3、普通方法依赖对象，每个方法都有self
            4、只有创建对象才可以调用、否则无法调用

"""

print("普通方法".center(30, "*"))


class Person:
    birthday = "1992-11-01"
    __dur_time = 100  # 前面加__ 私有

    def __init__(self, name, age):
        """
        定义共性特征:就是构造函数
        :param name: 姓名
        :param age: 年龄
        """
        self.name = name
        self.age = age

    def eat(self, food):
        print("{}正在吃{}！".format(self.name, food))
        print("{}几岁了".format(self.age))

    def run(self):
        print("{}今年{}岁了，正在跑步！".format(self.name, self.age))

    def info(self):
        print("{}出生于{}".format(self.name, self.birthday))  # 建议使用self.birthday，而不是Person.birthday

    @classmethod
    def update_dur_time(cls):
        """
        修改成员变量
        :return:
        """
        cls.__dur_time = 101

    def get_update_dur_time(self):
        return self.__dur_time


p = Person("张三", 18)
p.eat("红烧肉")
p.run()

p.name = '李四'
p.age = 28
p.eat("狮子头")

p.name = "Lucy"
p.info()
p.name = "Tony"
p.birthday = "1979-10-01"
p.info()

Person.update_dur_time()
result = p.get_update_dur_time()
print("消耗的时间{}".format(result))

print("类方法".center(30, "*"))


class Dog:
    def __init__(self, nickname):
        self.nickname = nickname

    def run(self):
        print("{}在院子中跑来跑去".format(self.nickname))

    def eat(self):
        print("吃饭。。。。。。。。。。。。")
        self.run()

    @classmethod
    def test(cls):  # cls class
        print(cls)  # <class '__main__.Dog'>
        # print(cls.nickname)  #报错
        # print(self.nickname)  #报错
        print()
        # cls.run() #报错


d = Dog("小黄")
d.run()

Dog.test()  # L

print("静态方法".center(30, "*"))


class People:

    def __int__(self, name):
        self.name = name

    @classmethod
    def update_name(cls):
        cls.__name__ = "葫芦娃"

    @staticmethod
    def show():
        print("静态方法")
        print("name =", People.__name__, sep=" ")


People.update_name()
People.show()
